/*
 * XMLParser
 * 
 * This class is responsible for generating XML Documents
 * 
 * Author: Carmine Colicino, Luigi Di Martino
 * Version: 1.0
 * 
 * 2014 - Copyright by Team 6 - University of Salerno
*/

package it.unisa.udocs.commons;

import it.unisa.udocs.data.*;
import it.unisa.udocs.data.Prodotto;

import java.util.ArrayList;

import org.jdom2.Document;
import org.jdom2.Element;

public class XMLParser {
	
	/**
	 * Generates a document containing all the products in the list
	 * @param list - the list of products
	 * @return an XML document 
	 */
	public static Document ricercaProdotti(ArrayList<Prodotto> list)
	{
		Element xml_root = new Element("response");
		Element xml_report ;
		Element xml_prod_id;
		Element xml_titolo;
		Element xml_stato;
		Element xml_codice;
		Element xml_pubblico;
		Element xml_anno_pubb;
		Element xml_lingua;
		Element xml_proprietario;
		Element xml_url;
		Element xml_abstract;
		Element xml_autori;
		Element xml_tipologia;
		Element xml_isbn;
		Element xml_casa_editrice;
		Element xml_capitoli;
		Element xml_pagine_da_a;
		Element xml_codice_ance;
		Element xml_nome_rivista;
		Element xml_volume;
		Element xml_argomento;
		Element xml_conferenza;
		Element xml_luogo;
		Element xml_data;


		//INSERIRE IL FOR  CHE SCORRE GLI ELEMENTI
		for(Prodotto e: list) {


			xml_report = new Element("report");
			xml_prod_id=new Element("prod_id");
			xml_titolo= new Element("titolo");
			xml_stato = new Element("stato");
			xml_codice = new Element("codice");
			xml_pubblico = new Element("pubblico");
			xml_anno_pubb = new Element("anno_pubb");
			xml_lingua = new Element("lingua"); 
			xml_proprietario = new Element("proprietario");
			xml_url =  new Element("url");
			xml_abstract = new Element("abstract");
			xml_autori = new Element("autori");
			xml_tipologia = new Element("tipologia");

			// XML ELEMENT PER ALTRE TIPOLOGIE DI PRODOTTO
			xml_isbn = new Element("isbn");
			xml_casa_editrice = new Element("casa_editrice");
			xml_capitoli = new Element("capitoli");
			xml_pagine_da_a = new Element("pagine_da_a");
			xml_codice_ance = new Element("codice_ance");
			xml_nome_rivista = new Element("nome_rivista");
			xml_volume = new Element("volume");
			xml_argomento =new Element("argomento");
			xml_conferenza = new Element("conferenza");
			xml_luogo = new Element("luogo");
			xml_data = new Element("data");




			xml_prod_id.setText( ""+e.getId_prodotto());
			xml_titolo.setText(e.getTitolo());
			xml_stato.setText(e.getStato());
			xml_codice.setText(e.getCodice());
			xml_pubblico.setText(e.getPubblico());
			xml_anno_pubb.setText(e.getAnno_pubblicazione());
			xml_lingua.setText(e.getLingua());
			xml_proprietario.setText(""+e.getProprietario());
			xml_url.setText(e.getUrl());
			xml_abstract.setText(e.getPr_abstract());
			xml_autori.setText(e.getAutori());
			xml_tipologia.setText(e.getTipologia());

			switch (e.getTipologia()) {



			case "articolo_libro" : {
				if(e instanceof ArticoloLibro) {
					ArticoloLibro temp = (ArticoloLibro) e;
					xml_isbn.setText(temp.getIsbn());
					xml_casa_editrice.setText(temp.getCasa_editrice());
					xml_capitoli.setText(temp.getCapitoli_da_a());
					xml_pagine_da_a.setText(temp.getPagine_da_a());
				}


				break;
			}
			case "articolo_rivista" : {
				if(e instanceof ArticoloRivista){
					ArticoloRivista temp = (ArticoloRivista) e;
					xml_pagine_da_a.setText(temp.getPagine_da_a());
					xml_codice_ance.setText(temp.getCodice_ance());
					xml_nome_rivista.setText(temp.getNome_rivista());
				}


				break;
			}
			case "monografia" : {

				if(e instanceof Monografia){
					Monografia temp = (Monografia) e;
					xml_volume.setText(""+temp.getVolume());
					xml_argomento.setText(temp.getArgomento());
				}

				break;
			}
			case "proceeding" : {
				if(e instanceof Proceeding){
					Proceeding temp = (Proceeding) e;
					xml_conferenza.setText(temp.getConferenza());
					xml_luogo.setText(temp.getLuogo());
					xml_data.setText(temp.getData().toString());
				}
				break;

			}

			}


			xml_report.addContent(xml_prod_id);
			xml_report.addContent(xml_titolo);
			xml_report.addContent(xml_stato);
			xml_report.addContent(xml_codice);
			xml_report.addContent(xml_pubblico);
			xml_report.addContent(xml_anno_pubb);
			xml_report.addContent(xml_lingua);
			xml_report.addContent(xml_proprietario);
			xml_report.addContent(xml_url);
			xml_report.addContent(xml_abstract);
			xml_report.addContent(xml_autori);
			xml_report.addContent(xml_tipologia);
			xml_report.addContent(xml_isbn);
			xml_report.addContent(xml_capitoli);
			xml_report.addContent(xml_pagine_da_a);
			xml_report.addContent(xml_casa_editrice);
			xml_report.addContent(xml_nome_rivista);
			xml_report.addContent(xml_codice_ance);
			xml_report.addContent(xml_volume);
			xml_report.addContent(xml_argomento);
			xml_report.addContent(xml_conferenza);
			xml_report.addContent(xml_luogo);
			xml_report.addContent(xml_data);

			xml_root.addContent(xml_report);



		} // end del for 

		Document doc = new Document(xml_root);
		return doc;
	}
	
	/**
	 * Generates a document containing all the accounts in the list
	 * @param listaAccount - the list of accounts
	 * @return an XML document
	 */

	public static Document ricercaAccount(ArrayList<Account> listaAccount) {

		Element xml_root = new Element("response");
		Element xml_report ;
		// All Account
		Element xml_acc_id;
		Element xml_user;
		Element xml_psw;
		Element xml_tipologia;
		// Ricercatore
		Element xml_nome; //ANCHE ADMIN & RespAteneo
		Element xml_cognome; //ANCHE ADMIN & RespAteneo
		Element xml_cod_fis;
		Element xml_data_nasc;
		Element xml_citta_nasc;
		Element xml_sex;
		Element xml_indirizzo;
		Element xml_email;
		Element xml_ruolo;
		Element xml_matricola;
		Element xml_anno_messa_in_ruolo;
		Element xml_dipart;
		Element xml_area_scient;
		//Responsabile di ateneo 
		Element xml_evento; // ID EVENTO , INT

		for(Account e: listaAccount){

			xml_report = new Element("report");
			// All Account
			xml_acc_id = new Element("id_account") ;
			xml_user = new Element("username") ;
			xml_psw = new Element("password") ;
			xml_tipologia = new Element("tipologia") ;
			// Ricercatore
			xml_nome = new Element("nome"); //ANCHE ADMIN & RespAteneo
			xml_cognome = new Element("cognome") ; //ANCHE ADMIN & RespAteneo
			xml_cod_fis = new Element("codice_fiscale") ;
			xml_data_nasc = new Element("data_nascita");
			xml_citta_nasc = new Element("citta_nascita") ;
			xml_sex = new Element("sesso");
			xml_indirizzo = new Element("indirizzo") ;
			xml_email = new Element("email") ;
			xml_ruolo = new Element("ruolo") ;
			xml_matricola = new Element("matricola") ;
			xml_anno_messa_in_ruolo = new Element("anno_messa_in_ruolo");
			xml_dipart = new Element("id_dipartimento");
			xml_area_scient = new Element("id_area_scientifica") ;
			//Responsabile di ateneo 
			xml_evento = new Element("id_evento"); // ID EVENTO , INT

			// INSERISCO I VALORI GENERICI DI TUTTI GLI ACCOUNT 
			xml_acc_id.setText(""+e.getId_account());
			xml_user.setText(e.getUsername());
			xml_psw.setText(e.getPassword());
			xml_tipologia.setText(e.getTipologia());

			// SWITCH PER VERIFICARE DI CHE TIPOLOGIA E' UN ACCOUNT 

			switch (e.getTipologia().toLowerCase()) {



			case "ricercatore" : {
				if(e instanceof Ricercatore) {
					Ricercatore temp = (Ricercatore) e;
					xml_nome.setText(temp.getNome());
					xml_cognome.setText(temp.getCognome());
					xml_cod_fis.setText(temp.getCodice_fiscale());
					xml_data_nasc.setText(""+temp.getData_nascita());
					xml_citta_nasc.setText(temp.getCitta_nascita());
					xml_sex.setText(temp.getSesso());
					xml_indirizzo.setText(temp.getIndirizzo());
					xml_email.setText(temp.getEmail());
					xml_ruolo.setText(temp.getRuolo());
					xml_matricola.setText(temp.getMatricola());
					xml_anno_messa_in_ruolo.setText(""
					+temp.getAnno_messa_in_ruolo());
					xml_dipart.setText(""+temp.getDipartimento());
					xml_area_scient.setText(""+temp.getAreaScientifica());


				}


				break;
			}
			case "amministratore" : {
				if(e instanceof Amministratore){
					Amministratore temp = (Amministratore) e;
					xml_nome.setText(temp.getNome());
					xml_cognome.setText(temp.getCognome());
				}


				break;
			}
			case "responsabile" : {

				if(e instanceof ResponsabileAteneo){
					ResponsabileAteneo temp = (ResponsabileAteneo) e;
					xml_nome.setText(temp.getNome());
					xml_cognome.setText(temp.getCognome());
					xml_evento.setText(""+temp.getEvento());
				}

				break;
			}


			} // fine Switch 

			xml_report.addContent(xml_acc_id);
			xml_report.addContent(xml_user);
			xml_report.addContent(xml_psw);
			xml_report.addContent(xml_tipologia);
			xml_report.addContent(xml_nome);
			xml_report.addContent(xml_cognome);
			xml_report.addContent(xml_cod_fis);
			xml_report.addContent(xml_data_nasc);
			xml_report.addContent(xml_citta_nasc);
			xml_report.addContent(xml_sex);
			xml_report.addContent(xml_matricola);
			xml_report.addContent(xml_indirizzo);
			xml_report.addContent(xml_email);
			xml_report.addContent(xml_ruolo);
			xml_report.addContent(xml_anno_messa_in_ruolo);
			xml_report.addContent(xml_dipart);
			xml_report.addContent(xml_area_scient);
			xml_report.addContent(xml_evento);

			xml_root.addContent(xml_report);


		} // FINE DEL FOR CHE CICLA TUTTI GLI ACCOUNT DELL ARRAYLIST 


		Document doc = new Document(xml_root);
		return doc; 

	}
	
	/**
	 * Generates a document containing all the departments in the list 	
	 * @param listaDipartimenti - the list of departments
	 * @return an XML Document
	 */
	public static Document ricercaDipartimento
	(ArrayList<Dipartimento> listaDipartimenti) {

		Element xml_root = new Element("response");
		Element xml_report ;
		
		Element xml_dip_id;
		Element xml_dip_nome;
		
		for(Dipartimento e: listaDipartimenti){

			xml_report = new Element("report");
			
			xml_dip_id = new Element("id_dipartimento");
			xml_dip_nome = new Element("nome_dipartimento");
			
			xml_dip_id.setText(""+e.getId_dipartimento());
			xml_dip_nome.setText(e.getNomeDip());
			
			xml_report.addContent(xml_dip_id);
			xml_report.addContent(xml_dip_nome);
			
			xml_root.addContent(xml_report);
		} 

		Document doc = new Document(xml_root);
		return doc; 

	}
	
	/**
	 * Generates a document containing all the scientific areas in the list
	 * @param listaAreaScientifica - the list of scientific areas
	 * @return an XML Document
	 */
	public static Document ricercaAreaScientifica(ArrayList<AreaScientifica> listaAreeScientifiche) {

		Element xml_root = new Element("response");
		Element xml_report ;
		
		Element xml_area_id;
		Element xml_area_nome;
		Element xml_area_codice;
		
		for(AreaScientifica e: listaAreeScientifiche){

			xml_report = new Element("report");
			
			xml_area_id = new Element("id_area_scientifica");
			xml_area_nome = new Element("nome_area_scientifica");
			xml_area_codice = new Element("codice_area_scientifica");
			
			xml_area_id.setText(""+e.getId_area());
			xml_area_nome.setText(e.getNome());
			xml_area_codice.setText(e.getCodiceArea());
			
			xml_report.addContent(xml_area_id);
			xml_report.addContent(xml_area_nome);
			xml_report.addContent(xml_area_codice);
			
			xml_root.addContent(xml_report);
		} 

		Document doc = new Document(xml_root);
		return doc; 

	}
	
	/**
	 * Generates a document containing all the events in the list
	 * @param listEventi - the list of events
	 * @return an XML Document
	 */
	public static Document ricercaEvento(ArrayList<Evento> listaEventi) {

		Element xml_root = new Element("response");
		Element xml_report ;
		
		Element xml_evento_id;
		Element xml_evento_nome;
		Element xml_evento_inizio;
		Element xml_evento_fine;
		Element xml_evento_bando;
		Element xml_evento_url;
		
		for(Evento e: listaEventi){

			xml_report = new Element("report");
			
			xml_evento_id = new Element("id_evento");
			xml_evento_nome = new Element("nome");
			xml_evento_inizio = new Element("data_inizio");
			xml_evento_fine = new Element("data_fine");
			xml_evento_bando = new Element("bando");
			xml_evento_url = new Element("url");
			
			xml_evento_id.setText(""+e.getId_evento());
			xml_evento_nome.setText(e.getNomeEvt());
			xml_evento_inizio.setText(e.getDataInizio().toString());
			xml_evento_fine.setText(e.getDataFine().toString());
			xml_evento_bando.setText(e.getBando());
			xml_evento_url.setText(e.getUrl());
			
			xml_report.addContent(xml_evento_id);
			xml_report.addContent(xml_evento_nome);
			xml_report.addContent(xml_evento_inizio);
			xml_report.addContent(xml_evento_fine);
			xml_report.addContent(xml_evento_bando);
			xml_report.addContent(xml_evento_url);
			
			xml_root.addContent(xml_report);
		} 

		Document doc = new Document(xml_root);
		return doc; 

	}

	/**
	 * Generates a document containing all the scientific areas and the departments in the lists
	 * @param areaLista - the list of scientific areas
	 * @param dipartLista - the list of departments
	 * @return an XML Document
	 */
	public static Document getAreaEDipart(ArrayList<AreaScientifica> areaLista , ArrayList<Dipartimento> dipartLista) {


		Element xml_root = new Element("response");
		Element xml_report;

		Element xml_area_id;
		Element xml_area_nome;
		Element xml_area_cod;

		Element xml_dip_id;
		Element xml_dip_nome;

		for(AreaScientifica e: areaLista) {

			xml_report = new Element("report");
			xml_area_id = new Element("id_area");
			xml_area_cod = new Element("area_cod");
			xml_area_nome = new Element("area_nome");

			xml_area_id.setText(""+e.getId_area());
			xml_area_cod.setText(e.getCodiceArea());
			xml_area_nome.setText(e.getNome());

			xml_report.addContent(xml_area_id);
			xml_report.addContent(xml_area_nome);
			xml_report.addContent(xml_area_cod);

			xml_root.addContent(xml_report);

		}
		for(Dipartimento e: dipartLista) {

			xml_report = new Element("reportDip");
			xml_dip_id = new Element("id_dipartimento");
			xml_dip_nome = new Element("nome_dipartimento");

			xml_dip_id.setText(""+e.getId_dipartimento());
			xml_dip_nome.setText(e.getNomeDip());

			xml_report.addContent(xml_dip_id);
			xml_report.addContent(xml_dip_nome);

			xml_root.addContent(xml_report);

		}
		
		Document doc = new Document(xml_root);
		return doc; 



	}
		
	/**
	 * Generates a document containing the number of notifications
	 * @param numNotifiche - the number of notifications
	 * @return an XML Document
	 */
	public static Document printNumeroNotifiche(int numNotifiche) {

		Element xml_root = new Element("response");
		Element xml_report;
		Element xml_notifiche;
		
		xml_report = new Element("report");
		xml_notifiche = new Element("notifiche");
		
		xml_notifiche.setText(""+numNotifiche);
		
		xml_report.addContent(xml_notifiche);
		xml_root.addContent(xml_report);

		Document doc = new Document(xml_root);
		return doc; 
	}
	
	/**
	 * Generates a document containing the URL of an uploaded file
	 * @param filePath - the path of an uploaded file
	 * @return an XML Document
	 */
	public static Document printUrl(String filePath) {

		Element xml_root = new Element("response");
		Element xml_report;
		Element xml_url;
		
		xml_report = new Element("report");
		xml_url = new Element("url");
		
		xml_url.setText(filePath);
		
		xml_report.addContent(xml_url);
		xml_root.addContent(xml_report);

		Document doc = new Document(xml_root);
		return doc; 
	}
	
	/**
	 * Generates a document containing the number of duplicated products
	 * @param numDuplicati - the number of duplicated products
	 * @return an XML Document
	 */
	public static Document ricercaDuplicati(int numDuplicati) {

		Element xml_root = new Element("response");
		Element xml_report;
		Element xml_duplicati;
		
		xml_report = new Element("report");
		xml_duplicati = new Element("duplicati");
		
		xml_duplicati.setText(""+numDuplicati);
		
		xml_report.addContent(xml_duplicati);
		xml_root.addContent(xml_report);

		Document doc = new Document(xml_root);
		return doc; 
	}
	
	/**
	 * Generates a document containing an integer (zero) that indicates the non-existence of an account
	 * @param x - an integer number (zero)
	 * @return an XML Document
	 */
	public static Document notAnAccount(int x) {

		Element xml_root = new Element("response");
		Element xml_report;
		Element xml_account;

		xml_report = new Element("report");
		xml_account = new Element("account");

		xml_account.setText(""+x);

		xml_report.addContent(xml_account);
		xml_root.addContent(xml_report);

		Document doc = new Document(xml_root);
		return doc; 
	}



}
